package redecolaborativa.objetos;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import redecolaborativa.sistema.Usuario;
import redecolaborativa.util.Util;

/**
 * Classe que representa o historico de atividades de um usuario.
 * @author Isabelly Rocha, Lilia Sampaio e Pedro Adelino.
 *
 */
public class HistoricoAtividades implements Serializable {
	private static final long serialVersionUID = 1L;
	private Map<Long, String> historicoAtividades;		
	
	public HistoricoAtividades() {
		historicoAtividades = new HashMap<Long, String>();
	}
	
	/**
	 * Retorna o historico de atividades do usuario.
	 * @return O historico de atividades do usuario.
	 */
	public Map<Long, String> atividades(){
		return new HashMap<Long, String>(historicoAtividades);
	}
	
	/**
	 * Adiciona uma atividade ao historico de atividades do usuario
	 * @param atividade Atividade a ser adicionado
	 * @return True caso a atividade for adicionada ou False caso a atividade nao tiver sido adicionada
	 * @throws InterruptedException 
	 */
	public void adicionaAtividade(String atividade, GregorianCalendar dataAtividade) throws InterruptedException {
		long timeInSeconds = dataAtividade.getTimeInMillis();
		if (!historicoAtividades.keySet().contains(timeInSeconds)) {
			historicoAtividades.put(timeInSeconds, atividade);
		}
	}
	
	/**
	 * Retorna uma lista contendo todas as atividades do usuario e seus amigos.
	 * @return Uma lista contendo todas as atividades do usuario e seus amigos.
	 */
	public List<String> retornaTodasAsPublicacoes(Usuario usuario){
		List<String> publicacoes = new LinkedList<String>();
		Iterator<Usuario> it = usuario.gerenteDeAmigos().getAmigos().iterator();
		while (it.hasNext()) {
			Usuario amigo = it.next();
			publicacoes.addAll(amigo.getHistoricoDeAtividades().historicoAtividades.values());
		}
		publicacoes.addAll(this.historicoAtividades.values());
		return publicacoes;
	}
	
	/**
	 * Retorna uma string contendo o historico de atividades conjuntas de um usuario.
	 * @param usuario Usuario logado no sistema.
	 * @return Uma string contendo o historico de atividades conjuntas de um usuario.
	 */
	public String historicoAtividades(Usuario usuario) {
		Map<Long, String> historico = usuario.getHistoricoDeAtividades().atividades();
		String atividades = "";
		Iterator<Long> it = Util.ordenaCrescente(historico.keySet()).iterator();
		while (it.hasNext()) {
			Long time = it.next();
			atividades += historico.get(time) + "; ";
		}
		if (atividades.isEmpty()) {
			return "Não há atividades";
		} return atividades.substring(0, atividades.length() - 2);
	}
	
	/**
	 * Retorna uma string contendo o historico de atividades conjuntas de um usuario e seus amigos.
	 * @param usuario Usuario logado no sistema.
	 * @return Uma string contendo o historico de atividades conjuntas de um usuario e seus amigos.
	 */
	public String historicoConjunto(Usuario usuario) {
		Map<Long, String> historico = usuario.getHistoricoDeAtividades().atividades();
		String atividades = "";
		List<Long> atividadesConjuntas = timeDeTodasAsAtividades(usuario);
		Iterator<Long> it = Util.ordenaCrescente(atividadesConjuntas).iterator();
		while (it.hasNext()) {
			Long time = it.next();
			if (historico.containsKey(time)) {
				atividades += historico.get(time) + "; ";
			} else {
				Iterator<Usuario> itAmigos = usuario.gerenteDeAmigos().getAmigos().iterator();
				while (itAmigos.hasNext()) {
					Usuario amigo = itAmigos.next();
					if (amigo.getHistoricoDeAtividades().atividades().containsKey(time)) {
						if (!atividades.contains(amigo.getHistoricoDeAtividades().atividades().get(time))) {
							atividades += amigo.getHistoricoDeAtividades().atividades().get(time) + "; ";
						}
					}
				}
				
			}
		} if (atividades.isEmpty()) {
			return "Não há atividades";
		} return atividades.substring(0, atividades.length() - 2);
	}
	
	/*
	 * Retorna um lista de long contendo todos os valores de tempo em que ocorreram atividades de um usuario e seus amigos.
	 */
	private List<Long> timeDeTodasAsAtividades(Usuario usuario) {
		List<Long> atividadesConjuntas = new ArrayList<Long>();
		Iterator<Usuario> it = usuario.gerenteDeAmigos().getAmigos().iterator();
		while (it.hasNext()) {
			Usuario amigo = it.next();
			Iterator<Long> it1 = amigo.getHistoricoDeAtividades().atividades().keySet().iterator();
			while (it1.hasNext()) {
				Long time = it1.next();
				if (!atividadesConjuntas.contains(time)) {
					atividadesConjuntas.add(time);
				}
			}
		}
		Iterator<Long> it2 = usuario.getHistoricoDeAtividades().atividades().keySet().iterator();
		while (it2.hasNext()) {
			Long l =  it2.next();
			if (!atividadesConjuntas.contains(l)) {
				atividadesConjuntas.add(l);
			}
		} return atividadesConjuntas;
	}
}